import datetime
import logging

# 全局单例实例
_logger_config = None


def get_logger_config(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    name=None,
):
    """获取全局日志配置单例

    Args:
        level: 日志级别，默认为INFO
        format: 日志格式，默认为"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        name: 日志器名称，默认为调用模块的名称

    Returns:
        LoggerConfig: 全局日志配置单例
    """
    global _logger_config
    if _logger_config is None:
        _logger_config = LoggerConfig(level, format, name)
    else:
        # 如果已经存在实例，更新name参数并设置日志级别
        _logger_config.logger = logging.getLogger(name if name else __name__)
        _logger_config.set_level(level)
        _logger_config.set_format(format)
        # 清除已有的处理器，避免重复添加
        if _logger_config.logger.handlers:
            _logger_config.logger.handlers.clear()
        # 重新添加处理器
        _logger_config._add_console_handler()
        _logger_config._add_file_handler()
    return _logger_config


class LoggerConfig:
    def __init__(
        self,
        level=logging.INFO,
        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        name=None,
    ):
        # 如果提供了name参数，则使用它；否则使用调用模块的名称
        self.logger = logging.getLogger(name if name else __name__)
        self.logger.setLevel(level)
        self.format = format
        self.current_log_date = None  # 初始化当前日志日期

        # 清除已有的处理器，避免重复添加
        if self.logger.handlers:
            self.logger.handlers.clear()

        # 添加控制台处理器
        self._add_console_handler()

        # 添加文件处理器
        self._add_file_handler()

        # 记录初始化信息
        self.logger.info("日志配置初始化完成")

    def ensure_file_handler_up_to_date(self):
        """确保文件处理器使用当前日期"""
        tz = datetime.timezone(datetime.timedelta(hours=8))
        today = datetime.datetime.now(tz).date()

        # 如果日期变化或未初始化，更新文件处理器
        if not self.current_log_date or self.current_log_date != today:
            # 移除旧的文件处理器
            for handler in self.logger.handlers[:]:
                if isinstance(handler, logging.FileHandler):
                    self.logger.removeHandler(handler)
                    handler.close()

            # 添加新的文件处理器
            self._add_file_handler()

    def _add_console_handler(self):
        """添加控制台日志处理器"""
        formatter = logging.Formatter(self.format)
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(formatter)
        self.logger.addHandler(console_handler)

    def _add_file_handler(self):
        """添加文件日志处理器，按年/月-日格式组织"""
        # 使用带时区的当前时间（北京时间）
        tz = datetime.timezone(datetime.timedelta(hours=8))
        now = datetime.datetime.now(tz)
        year_dir = now.strftime("%Y-%m")
        log_file = now.strftime("%m-%d.log")

        from utils.path_utils import PathUtils

        # 构建日志目录路径
        logs_dir = PathUtils.join_path(PathUtils.get_project_root(), "logs", year_dir)
        PathUtils.ensure_dir_exists(logs_dir)

        # 构建日志文件完整路径
        log_file_path = PathUtils.join_path(logs_dir, log_file)

        # 创建文件处理器
        formatter = logging.Formatter(self.format)
        file_handler = logging.FileHandler(log_file_path, encoding="utf-8")
        file_handler.setFormatter(formatter)
        self.logger.addHandler(file_handler)

        # 记录日志文件位置
        self.logger.info(f"日志文件路径: {log_file_path}")

        # 保存当前日志日期用于后续检查
        self.current_log_date = now.date()

    def get_logger(self):
        return self.logger

    def set_level(self, level):
        """设置日志级别"""
        self.logger.setLevel(level)

    def set_format(self, format):
        """设置日志格式"""
        self.format = format
        for handler in self.logger.handlers:
            handler.setFormatter(logging.Formatter(format))


def get_logger(name=None):
    """获取已更新文件处理器的logger"""
    logger_config = get_logger_config(name=name)
    logger_config.ensure_file_handler_up_to_date()
    return logger_config.get_logger()


logger = get_logger()
